package com.allenkerr.springboot.config;

import com.allenkerr.springboot.dao.UserDAO;
import com.jolbox.bonecp.BoneCPDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;
import java.util.concurrent.TimeUnit;

//通过该注解来表明该类是一个Spring的配置，相当于一个xml文件
@Configuration
//配置扫描包
@ComponentScan(basePackages = "com.allenkerr.springboot.service")
//引入外部资源文件
//如果配置的配置文件不存在，加上 ignoreResourceNotFound = true
//@PropertySource(value = {"classpath:db.properties"},ignoreResourceNotFound = true)
@PropertySource(value = {"classpath:db.properties"})
public class SpringConfig {

    //通过该注解来表明是一个Bean对象，相当于xml中的<bean>
    @Bean
    public UserDAO getUserDAO() {
        //直接new对象做演示
        return new UserDAO();
    }

    /**
     * <!-- 定义数据源 -->
     * <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
     * <!-- 数据库驱动 -->
     * <property name="driverClass" value="${jdbc.driverClassName}" />
     * <!-- 相应驱动的jdbcUrl -->
     * <property name="jdbcUrl" value="${jdbc.url}" />
     * <!-- 数据库的用户名 -->
     * <property name="username" value="${jdbc.username}" />
     * <!-- 数据库的密码 -->
     * <property name="password" value="${jdbc.password}" />
     * <!-- 检查数据库连接池中空闲连接的间隔时间，单位是分，默认值：240，如果要取消则设置为0 -->
     * <property name="idleConnectionTestPeriod" value="60" />
     * <!-- 连接池中未使用的链接最大存活时间，单位是分，默认值：60，如果要永远存活设置为0 -->
     * <property name="idleMaxAge" value="30" />
     * <!-- 每个分区最大的连接数 -->
     * <!-- 判断依据：请求并发数 -->
     * <property name="maxConnectionsPerPartition" value="100" />
     * <!-- 每个分区最小的连接数 -->
     * <property name="minConnectionsPerPartition" value="5" />
     * </bean>
     */
    @Value("${jdbc.driverClassName}")
    private String driverClass;

    @Value("${jdbc.url}")
    private String jdbcUrl;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    public DataSource dataSource() {
        BoneCPDataSource boneCPDataSource = new BoneCPDataSource();
        //数据库驱动
        boneCPDataSource.setDriverClass(driverClass);
        //相应驱动的jdbcUrl
        boneCPDataSource.setJdbcUrl(jdbcUrl);
        //数据库的用户名
        boneCPDataSource.setUsername(username);
        //数据库的密码
        boneCPDataSource.setPassword(password);
        //检查数据库连接池中空闲连接的间隔时间，单位是分，默认值：240，如果要取消则设置为0
        boneCPDataSource.setIdleConnectionTestPeriod(60, TimeUnit.MINUTES);
        //连接池中未使用的链接最大存活时间，单位是分，默认值：60，如果要永远存活设置为0
        boneCPDataSource.setIdleMaxAge(30, TimeUnit.MINUTES);
        //每个分区最大的连接数
        boneCPDataSource.setMaxConnectionsPerPartition(100);
        //每个分区最小的连接数
        boneCPDataSource.setMinConnectionsPerPartition(5);
        return boneCPDataSource;
    }

}